#include <iostream>
#include <unistd.h>
#include <ctime>
#include <string>

#include "thread_pool.hpp"

using namespace std;

const string ops = "+-*/%";

struct task {
    task() {}

    task(int x, int y, char op) : _x(x), _y(y), _op(op) {}

    string get_task() {
        return to_string(_x) + " " + _op + " " + to_string(_y) + " = ?";
    }
    string get_answer() {
        string ans = to_string(_x) + " " + _op + " " + to_string(_y) + " = ";
        switch(_op) {
            case '+': return ans + to_string(_x + _y);
            case '-': return ans + to_string(_x - _y);
            case '*': return ans + to_string(_x * _y);
            case '/':
                if(_y == 0) {
                    return "div_by_zero";
                } 
                return ans + to_string(_x / _y);
            case '%': 
                if(_y == 0) {
                    return "mod_by_zero";
                }
                return ans + to_string(_x % _y);
            default: return "op error";
        }
    }
    int _x;
    int _y;
    char _op;
};

char get_op() {
    return ops[rand() % ops.size()];
}

int main() {
    srand(time(nullptr));
    // 主线程构造任务放入任务队列，相当于生产者
    // 子线程从任务队列中取出任务执行，相当于消费者
    thread_pool<task> *tp = new thread_pool<task>;
    while(true) {
        // 获取数据
        int x = rand() % 10 + 1, y = rand() % 10;
        char op = get_op();
        // 生产数据
        task t = {x, y, op};
        cout << "主线程生产了一个任务：" << t.get_task() << endl;
        tp->push(t);
        sleep(1);
    }
    delete tp;
    return 0;
}